package nioserver;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;

/**
 * 最后启动一个服务器端，来运行这个non-blocking IO的服务器端。
 * 在main函数中，首先open一个selector和ServerSocketChannel，配置为non-blocking IO模式，绑定服务端口9000并注册OP_ACCEPT。
 * 最后启动多路复用分发器线程和分配器线程。
 * 
 * 在non-blocking IO模式中，DemultiPlexer类是担任了筛选事件和注册事件的工作，Selector.select()采用的是blocking方式，
 * 调用select方法，都必须等到其有返回值为至，但select方法本身是线程安全的，因此DemultiPlexer类在运行环境下可以存在多个线程，
 * 配合多个Dispacher线程一起工作。
 * 
 * @author Xinz
 *
 */
public class NIOServer {
	public static void main(String[] args) throws IOException {
		Selector selector = Selector.open();
		ServerSocketChannel ssc = ServerSocketChannel.open();
		ssc.configureBlocking(false);
		ssc.socket().bind(new InetSocketAddress(8888));
		ssc.register(selector, SelectionKey.OP_ACCEPT);
		NIODispatcher dispatcher = new NIODispatcher();
		dispatcher.start();
		new NIODemultiPlexer(selector, dispatcher).start();
	}
}
